package com.ilxqx.generator.util;

import com.ilxqx.generator.config.ConfigProperties;
import com.ilxqx.generator.parser.Table;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

import java.io.File;
import java.util.Map;

@Slf4j
public final class GenerationUtils {

    private static final String DELIMITER = "/";
    private static final String TEMPLATE_SUFFIX = ".ftl";

    /**
     * 解析文件名
     * @param nameTemplate 文件名模板
     * @param placeholders 占位符替换map
     * @return 文件名
     */
    private static String parseFileName(String nameTemplate, Map<String, String> placeholders) {
        String fileName = nameTemplate;
        for (Map.Entry<String, String> entry : placeholders.entrySet()) {
            fileName = StringUtils.replace(fileName, "${" + entry.getKey() + "}", entry.getValue());
        }
        return fileName;
    }

    /**
     * 解析文件存放路径
     * @param packageName 包名称
     * @return 路径字符串
     */
    private static String parseFilePath(String packageName) {
        String packagePath = String.join(DELIMITER, StringUtils.split(packageName, "."));
        return StringUtils.removeEnd(ConfigProperties.INSTANCE.getAbsoluteClassPath(), DELIMITER) + DELIMITER + packagePath;
    }

    /**
     * 生成模板代码
     * @param template 模板
     * @param dataModel 数据模型
     * @param placeholders 占位符数据
     */
    public static void generateTemplateCode(ConfigProperties.Template template, Map<String, Object> dataModel, Map<String, String> placeholders) {
        Table tableInfo = (Table) dataModel.get("table");
        Assert.notNull(tableInfo, "表元信息不存在");
        log.info("开始准备生成模板【{}】的代码", template.getTemplateName());
        String packageName = ConfigProperties.INSTANCE.getBasePackage() + (StringUtils.isNotBlank(template.getSubPackage()) ? ("." + template.getSubPackage()) : "");
        dataModel.put("package", packageName);
        File directory = new File(parseFilePath(packageName));
        if (!directory.exists() && !directory.mkdirs()) {
            log.warn("目录[{}]无法创建，模板[{}]代码无法继续生成", directory.getAbsolutePath(), template.getTemplateName());
            return;
        }
        TemplateUtils.render(StringUtils.removeEnd(template.getTemplatePath(), DELIMITER) + DELIMITER + template.getTemplateName() + TEMPLATE_SUFFIX,
            dataModel, new File(directory, parseFileName(template.getFileName(), placeholders)));
        log.info("模板[{}]代码生成完毕", template.getTemplateName());
    }



}
